package medium

/*
时间复杂度:O(N)
空间复杂度:O(1)

解:
	1.取的所有的元素都是左右两边的连续元素,所以求左右两边若干元素和=x <=> 求不固定窗口内元素和为sum-x(sum是所有元素之和);
	2.而题目求的是最小操作次数,即对应最长的窗口
*/

func minOperations(nums []int, x int) int {
	sum := 0
	for _, v := range nums {
		sum += v
	}
	target := sum - x
	//if target < 0 {
	//	return -1
	//}
	left, right := 0, 0
	windowSum := 0
	windowLen := -1
	for right < len(nums) {
		windowSum += nums[right]
		// target可能为负数,所以left可能会一直右移导致超出索引范围
		// 或者直接在循环外对target为负数的情况进行排除
		for left <= right && windowSum > target {
			windowSum -= nums[left]
			left++
		}
		if windowSum == target && windowLen < right-left+1 {
			windowLen = right - left + 1
		}
		right++
	}
	if windowLen == -1 {
		return -1
	}
	return len(nums) - windowLen
}
